package middleware

import (
	"demo_system/core"
	"demo_system/encrypt"
	"encoding/json"
	"errors"
	"github.com/kataras/iris"
	"strconv"
)

//授权中间件

//对登陆进行授权
func AuthLogin(ctx iris.Context) {
	//不需要验证的连接
	noNeedAuth := map[string]bool{"/user/login": true, "/user/register": true}
	uid := ctx.GetCookie("uid")
	uPath := ctx.RequestPath(true)
	if !noNeedAuth[uPath] {
		if uid == "" {
			ctx.Application().Logger().Error("!!尚未登录!!")
			ctx.Redirect("/user/login") //跳转登录页面
			return
		}

		//验证加密串是否被修改
		err := checkUserInfo(uid, ctx)
		if err != nil {
			ctx.Application().Logger().Error(err)
			ctx.Redirect("/user/login") //跳转登录页面
			return
		}
	}

	ctx.Next()
}

//身份校验函数
func checkUserInfo(uidStr string, ctx iris.Context) error {
	//获取用户加密串
	signCookie := ctx.GetCookie("sign")
	if signCookie == "" {
		return errors.New("用户加密串 Cookie 获取失败！")
	}

	//对信息进行解密
	signByte, err := encrypt.DePwdCode(signCookie)
	if err != nil {
		return errors.New("加密串已被篡改！")
	}
	loginStatus := &core.LoginStatus{}
	err = json.Unmarshal(signByte, loginStatus)
	if err != nil {
		return errors.New("用户信息反json化失败！:" + err.Error())
	}

	if checkInfo(uidStr, strconv.FormatInt(loginStatus.UId, 10)) {
		return nil
	}
	return errors.New("身份校验失败！")
	//return nil
}

//自定义逻辑判断
func checkInfo(checkStr string, signStr string) bool {
	if checkStr == signStr {
		return true
	}
	return false
}
